package org.example;


import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    //浏览器地址栏输入url访问网页都是get方法
    //模板引擎都是返回html，所以冲洗doGet方法

    //使用thymeleaf模板技术
    //创建一个模板引擎
    TemplateEngine engine = new TemplateEngine();

    @Override
    public void init() throws ServletException {

        //创建一个网页模板的解析器:ServletContextTemplateResolver是HttpServlet中的方法，返回Servlet上下文对象
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(getServletContext());
        //绑定模板
        resolver.setCharacterEncoding("utf-8");//设置渲染时编码
        //设置网页模板我呢见，路径的前缀和后缀
        resolver.setPrefix("WEB-INF/templates/");//设置前缀
        resolver.setSuffix(".html");//设置后缀
        //将模板解析器绑定到模板引擎当中
        engine.setTemplateResolver(resolver);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");

        //创建一个web上下文（环境的语义，里面有一个map结构，可以存放键值对的数据）
        WebContext webContext = new WebContext(req,resp,getServletContext());
        //设置了一个键为message的键值对，可以理解为：为网页模板定义了一个message变量(变量名为message,值为hello...)
        //queryString传入msg=xxx
        webContext.setVariable("message",req.getParameter("msg"));
        //写网站的绝对路径要加http://写全
        webContext.setVariable("a1","http://www.sogou.com");
        webContext.setVariable("a2","http://www.baidu.com");
        webContext.setVariable("isLogin",false);

        //Arrays.asList()中的参数为可变参数，是将可变参数数组转变为list
        webContext.setVariable("names", Arrays.asList("张三","李四","王五"));
        //相当于为模板定义了一个变量users=ArrayList(users)
        webContext.setVariable("users",Arrays.asList(
                new User("张三",18),
                new User("李四",20),
                new User("王五",22)
        ));
        //模板引擎渲染网页模板：第一个参数为模板名称，第二个参数为web上下文（里面保存了数据）
        //会根据模板解析器设种子的前缀 + 模板名称 + 后缀，为模板路径，查找到模板，再组织我们的模板内容+数据
        //返回值就是渲染后的网页字符串
        String html = engine.process("hello",webContext);
        resp.getWriter().write(html);
    }

    static class User{
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}
